package com.asiainfo.framework.dao;

import com.asiainfo.framework.model.Model;
import com.asiainfo.framework.web.page.PageResult;
import com.asiainfo.framework.web.page.Pagination;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public interface Dao {

    /**
     * 获取sqlSession对象
     */
    SqlSession getSqlSession();

    /**
     * 查询列表，无参
     */
    <E> List<E> selectList(String statementId);

    /**
     * 查询列表
     */
    <E> List<E> selectList(String statementId, Object param);

    /**
     * 查询列表，有分页参数
     */
    <E> PageResult<E> selectList(String statementId, Object param, Pagination pagination);

    /**
     * 单表查询列表
     */
    <E> List<E> selectList(Model model);

    /**
     * 单表查询列表，有分页参数
     */
    <E> PageResult<E> selectList(Model entity, Pagination pagination);

    /**
     * 单表查询列表，有分页参数
     */
    <E> PageResult<E> selectList(Model entity, Pagination pagination, Integer cacheSeconds);

    /**
     * 查询一个对象 无参
     */
    <T> T selectOne(String statementId);

    /**
     * 查询一个对象
     */
    <T> T selectOne(String statementId, Object param);

    /**
     * 查询一个对象
     */
    <T> T selectOne(Model model);

    /**
     * 获取总数，无参
     */
    Long selectCount(String statementId);

    /**
     * 获取总数
     */
    Long selectCount(String statementId, Object param);

    /**
     * 获取总数
     */
    Long selectCount(Model model);

    /**
     * 根据语句插入数据
     */
    int insert(String statementId);

    /**
     * 根据语句插入数据
     */
    int insert(String statementId, Object param);

    /**
     * 插入一个对象
     */
    int insert(Model model);

    /**
     * 批量插入对象
     */
    void insertBatch(List<? extends Model> list);

    /**
     * 根据语句更新数据
     */
    int update(String statementId);

    /**
     * 根据语句更新数据
     */
    int update(String statementId, Object param);

    /**
     * 更新一个对象
     */
    int update(Model model);

    /**
     * 批量更新对象
     */
    void updateBatch(List<? extends Model> list, String... conditionColumns);

    /**
     * 根据语句删除数据
     */
    int delete(String statementId);

    /**
     * 根据语句删除数据
     */
    int delete(String statementId, Object param);


    /**
     * 删除一个对象
     */
    int delete(Model entity);

}
